## Подключение Git Bash к GitHub.com с использованием SSH

Эта статья подразумевает, что у вас уже есть учетная запись на github.com, вы скачали и установили Git Bash с сайта git-scm.com и теперь хотите работать со своими репозиториями, используя SSH.

Собственно о том, как настроить этот самый SSH и пойдет речь в этой статье.


Но сначала о том, что особенного в этом методе подключения.

Подключение с использованием SSH подразумевает генерацию пары ключей, добавление этих ключей к SSH-агенту, при помощи которого и будет происходит взаимодействие, а также добавление открытого ключа к своему аккаунту на github.com.

Использование SSH избавляет вас от необходимости использовать имя и пароль, так как вместо этого используется пара ключей — открытый и закрытый (public and private), однако в целях безопасности закрытый ключ должен быть зашифрован при помощи пароля.

Для начала, проверим нет ли у нас каких либо уже существующих ключей.
Запустим Git Bash и введем команду

    ls -al ~/.ssh
Этой командой мы получаем список файлов из папки .ssh, находящейся в профиле текущего пользователя — ~. Если вы там обнаружите что-то вроде `id_rsa` и `id_rsa.pub`, то, возможно, ключ у вас уже есть, и если вместо генерации новых вы решите использовать существующий, то можете сразу переходить к шагу добавления ключей к ssh-агенту. Мы же тут сделаем вид, что никаких ключей у нас нет и приступим к их генерации.

### Генерируем ключи
Для генерации новой пары ключей в консоли git bash введите следующую команду:

    ssh-keygen -t rsa -b 4096 -C "legioner9@inbox.ru"

    Enter file in which to save the key (/c/Users/79953/.ssh/id_rsa):/c/Users/79953/.ssh/id_rsa
В этой команде параметр -t задает тип, в данном случае мы используем rsa. Параметр -b задает длину ключа, 4096 выглядит вполне подходящим значением. Параметр -C задает комментарий к генерируемым ключам, в котором мы указываем свой email адрес.

Git bash сообщит что происходит генерация ключа, а после попросит указать место сохранения файлов с ключами. Мы можем либо нажать Enter и согласиться с местоположением и именем по умолчанию: `~/.ssh/id_rsa` и `~/.ssh/id_rsa.pub`, либо указать свой вариант.

### Добавляем ключи к ssh-агенту
Теперь нам нужно добавить сгенерированные ключи к ssh-агенту.

Тут есть интересная вещь, если у вас установлен Git Desktop, то вы можете управлять репозиториями через него и не обращать внимания на то, о чем мы тут говорим. Однако же, управление Git через консоль с помощью какой либо утилиты, вроде Git for Windows, о чем мы здесь и рассуждаем, является более предпочтительным методом, поэтому стоит обратить внимание на вопросы запуска ssh-агента. Далее в статье мы рассмотрим, как настроить его автоматический запуск, сейчас же мы запустим его вручную, командой:

    eval $(ssh-agent -s)
Теперь нам нужно добавить созданные ключи к ssh-агенту. Сделаем мы это командой:

    $ ssh-add ~/.ssh/id_rsa
В данном случае мы указали местоположение по-умолчанию. Именно в этом файле будут находиться ключи в случае, если на вопрос о месте сохранения файлов ключей при их генерации вы приняли значение по-умолчанию, нажав Enter.

Если вы указали некоторое отличное от значения по-умолчанию местоположение, то в качестве аргумента вы просто указываете нужный путь и имя файла.

### Добавление ключа к вашей учетной записи на GitHub.com
Итак, что мы имеем. Мы сгенерировали пару ключей, ссобщили об их местонахождении ssh-агенту. Теперь же нам нужно также сообщить сайту GitHub.com об их существовании. Точнее о существовании открытого ключа из созданной нами пары.

Для этого сначала получим значение открытого ключа при помощи следующей команды:

    clip < ~/.ssh/id_rsa.pub
Эта команда копирует содержимое файла открытого ключа (опять же из расположения по-умолчанию) в буфер обмена. Этого же результата мы можем достичь, открыв вышеупомянутый файл в каком-либо текстовом редакторе и скопировав его содержимое.

Далее заходим на сайт GitHub.com под своей учетной записью и, щелкнув на своем аватаре, выбираем Settings. В меню, расположенном в левой части, выбираем SSH and GPG keys и нажимаем New SSH key. Заполняем поле Title, для того, чтобы нам самим было понятнее, что это за ключ, вставляем содержимое файла открытого ключа из буфера в поле Key и нажимаем Add SSH key.

### Проверка SSH-соединения
Теперь давайте проверим ssh-соединение. Для этого в консоли Git Bash введем команду:

    ssh -T git@github.com
При этом вы получите просьбу ввести пароль шифрования закрытого ключа.

После ввода пароля вы можете получить что-то вроде:

    The authenticity of host 'github.com (192.30.252.1)' can't be established.
    RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
    Are you sure you want to continue connecting (yes/no)?

или:

    The authenticity of host 'github.com (192.30.252.1)' can't be established.
    RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
    Are you sure you want to continue connecting (yes/no)?

В этом случае проверьте, что и вы и Git Bash имеете в виду один и тот же ключ, сверив выведенное значение отпечатка (fingerprint) с тем, что было получено при генерации ключей. Ели все в порядке, отвечайте на вопрос утвердительно.

В итоге вы должны получить сообщение:

    Hi username! You've successfully authenticated, but GitHub does not
    provide shell access.

где вместо username должно присутсвовать имя вашей учетной записи.

### Изменение пароля шифрования закрытого ключа
В случае, если при генерации ключей вы не указали пароль шифрования закрытого ключа, он будет сохранен в открытом виде, чего делать не рекомендуется. В этом случае вы можете задать пароль шифрования для уже существующего ключа без его повторной генерации. Также вы можете сменить пароль для уже зашифрованного ключа.
Сделать это можно командой:

    ssh-keygen -p

### Автоматический запуск ssh-агента при старте Git Bash
Для того, чтобы ssh-агент каждый раз запускался автоматически при старте Git Bash, добавьте в файл ~/.profile или ~/.bashrc следующий код:

    env=~/.ssh/agent.env
 
    agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
 
    agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }
 
    agent_load_env
 
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
        ssh-add
    elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
        ssh-add
    fi
    
    unset env
Теперь при запуске Git Bash также будет запускаться и ssh-агент. Если при генерации ключей (или позже) мы задали пароль для шифрования закрытого ключа, при запуске, ssh-агент будет проявлять интерес к его значению. Поянтно, что после закрытия Git Bash, его содержимое будет забыто и закрытый ключ будет в безопасности.

Если же мы хотим, чтобы забытие пароля шифрования ssh-агентом происходило быстрее, мы можем задать нужный интервал времени в секундах при помощи команды:

ssh-add -t 300